package org.jiuling.kuaidi100.dto;

import java.util.List;

/**
 * 快递信息推送数据传输对象
 * @author 紫灵
 * @date 2024年03月01日 11时15分32秒
 */
public class ExpressInfoPushDto {

    /** 	监控状态:polling:监控中，shutdown:结束，abort:中止，updateall：重新推送。其中当快递单为已签收时status=shutdown，当message为“3天查询无记录”或“60天无变化时”status= abort ，对于status=abort的状态，需要增加额外的处理逻辑 */
    private String status;
    /** 监控状态相关消息，如:3天查询无记录，60天无变化 */
    private String message;
    /** 快递公司编码是否出错，0为本推送信息对应的是贵司提交的原始快递公司编码，1为本推送信息对应的是我方纠正后的新的快递公司编码。一个单如果我们连续3天都查不到结果，我方会（1）判断一次贵司提交的快递公司编码是否正确，如果正确，给贵司的回调接口（callbackurl）推送带有如下字段的信息：autoCheck=0、comOld与comNew都为空；（2）如果贵司提交的快递公司编码出错，我们会帮忙用正确的快递公司编码+原来的运单号重新提交订阅并开启监控（后续如果监控到单号有更新就给贵司的回调接口（callbackurl）推送带有如下字段的信息：autoCheck=1、comOld=原来的公司编码、comNew=新的公司编码）；并且给贵方的回调接口（callbackurl）推送一条含有如下字段的信息：status=abort、autoCheck=0、comOld为空、comNew=纠正后的快递公司编码 */
    private String autoCheck;
    /** 贵司提交的原始的快递公司编码。详细见autoCheck后说明。若开启了国际版（即在订阅请求中增加字段interCom=1），则回调请求中暂无此字段 */
    private String comOld;
    /** 我司纠正后的新的快递公司编码。详细见autoCheck后说明。若开启了国际版（即在订阅请求中增加字段interCom=1），则回调请求中暂无此字段 */
    private String comNew;
    /** 最新查询结果 */
    private LastResultDto lastResult;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getAutoCheck() {
        return autoCheck;
    }

    public void setAutoCheck(String autoCheck) {
        this.autoCheck = autoCheck;
    }

    public String getComOld() {
        return comOld;
    }

    public void setComOld(String comOld) {
        this.comOld = comOld;
    }

    public String getComNew() {
        return comNew;
    }

    public void setComNew(String comNew) {
        this.comNew = comNew;
    }

    public LastResultDto getLastResult() {
        return lastResult;
    }

    public void setLastResult(LastResultDto lastResult) {
        this.lastResult = lastResult;
    }

    /**
     * 最新查询结果，若在订阅报文中通过interCom字段开通了国际版，则此lastResult表示出发国的查询结果，全量，倒序（即时间最新的在最前）
     */
    public static class LastResultDto{

        /** 消息体 */
        private String message;
        /** 快递单当前状态，默认为0在途，1揽收，2疑难，3签收，4退签，5派件，8清关，14拒签等10个基础物流状态，如需要返回高级物流状态，请参考 resultv2 传值 */
        private String state;
        /** 通讯状态 */
        private String status;
        /** 快递单明细状态标记，暂未实现，请忽略 */
        private String condition;
        /** 是否签收标记，0未签收，1已签收 */
        private String ischeck;
        /** 快递公司编码,一律用小写字母 */
        private String com;
        /** 单号 */
        private String nu;
        /** 数据 */
        private List<DataDto> data;

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

        public String getState() {
            return state;
        }

        public void setState(String state) {
            this.state = state;
        }

        public String getStatus() {
            return status;
        }

        public void setStatus(String status) {
            this.status = status;
        }

        public String getCondition() {
            return condition;
        }

        public void setCondition(String condition) {
            this.condition = condition;
        }

        public String getIscheck() {
            return ischeck;
        }

        public void setIscheck(String ischeck) {
            this.ischeck = ischeck;
        }

        public String getCom() {
            return com;
        }

        public void setCom(String com) {
            this.com = com;
        }

        public String getNu() {
            return nu;
        }

        public void setNu(String nu) {
            this.nu = nu;
        }

        public List<DataDto> getData() {
            return data;
        }

        public void setData(List<DataDto> data) {
            this.data = data;
        }

        /**
         * 数据
         */
        public static class DataDto{
            /** 内容 */
            private String context;
            /** 时间，原始格式 */
            private String time;
            /** 格式化后时间 */
            private String ftime;
            /** 本数据元对应的物流状态名称或者高级状态名称，提交resultv2=1或者resultv2=4标记后才会出现 */
            private String status;
            /** 本数据元对应的高级物流状态值，提交resultv2=4标记后才会出现 */
            private String statusCode;
            /** 本数据元对应的行政区域的编码，提交resultv2=1或者resultv2=4标记后才会出现 */
            private String areaCode;
            /** 本数据元对应的行政区域的名称，提交resultv2=1或者resultv2=4标记后才会出现 */
            private String areaName;
            /** 本数据元对应的行政区域经纬度，提交resultv2=4标记后才会出现 */
            private String areaCenter;
            /** 本数据元对应的快件当前位置，提交resultv2=4标记后才会出现 */
            private String location;
            /** 本数据元对应的行政区域拼音，提交resultv2=4标记后才会出现 */
            private String areaPinYin;

            public String getContext() {
                return context;
            }

            public void setContext(String context) {
                this.context = context;
            }

            public String getTime() {
                return time;
            }

            public void setTime(String time) {
                this.time = time;
            }

            public String getFtime() {
                return ftime;
            }

            public void setFtime(String ftime) {
                this.ftime = ftime;
            }

            public String getStatus() {
                return status;
            }

            public void setStatus(String status) {
                this.status = status;
            }

            public String getStatusCode() {
                return statusCode;
            }

            public void setStatusCode(String statusCode) {
                this.statusCode = statusCode;
            }

            public String getAreaCode() {
                return areaCode;
            }

            public void setAreaCode(String areaCode) {
                this.areaCode = areaCode;
            }

            public String getAreaName() {
                return areaName;
            }

            public void setAreaName(String areaName) {
                this.areaName = areaName;
            }

            public String getAreaCenter() {
                return areaCenter;
            }

            public void setAreaCenter(String areaCenter) {
                this.areaCenter = areaCenter;
            }

            public String getLocation() {
                return location;
            }

            public void setLocation(String location) {
                this.location = location;
            }

            public String getAreaPinYin() {
                return areaPinYin;
            }

            public void setAreaPinYin(String areaPinYin) {
                this.areaPinYin = areaPinYin;
            }
        }
    }

}
